#ifndef PDTD_HPP
#define PDTD_HPP

#include "ap_int.h"
#include "ap_fixed.h"
#include "hls_stream.h"
#include "fpal.hpp" // 包含定点数运算逻辑库
#include "hr.hpp"   // 包含 HR 模块的头文件，获取 pixel_fragment_packet_fixed 定义

// -----------------------------------------------------------
// PDTD与DDR_Write_Engine之间传输的写操作指令包
// -----------------------------------------------------------
struct ddr_write_packet_fixed {
    fpal::fp_screen_pixel_idx_t screen_x;       // 屏幕X坐标
    fpal::fp_screen_pixel_idx_t screen_y;       // 屏幕Y坐标
    fpal::fp_z_buffer_t new_z;                  // 新的插值深度值
    fpal::fp_color_channel_t pure_color_R;      // 纯色R
    fpal::fp_color_channel_t pure_color_G;      // 纯色G
    fpal::fp_color_channel_t pure_color_B;      // 纯色B
};

// -----------------------------------------------------------
// DDR AXI Master 接口使用的 64 位数据类型
// -----------------------------------------------------------
// 一个 64 位字可以存储 4 个 16 位的深度值
typedef ap_uint<64> zbuffer_ddr_word_t;
// 一个 64 位字可以存储 2 个 24 位 RGB 颜色值 (打包为 32 位)
typedef ap_uint<64> color_ddr_word_t;


// -----------------------------------------------------------
// PDTDW 模块的主HLS函数声明
// -----------------------------------------------------------
void pixel_depth_test_and_dispatch(
    hls::stream<pixel_fragment_packet_fixed>& input_pixel_fragment_stream,
    hls::stream<ddr_write_packet_fixed>& output_ddr_write_stream,
    const ap_uint<11> max_x_res,
    const ap_uint<11> max_y_res,
    const ap_uint<32> num_fragments_from_hr // 从HR接收的像素片段总数
);

// -----------------------------------------------------------
// DDR_Write_Engine 模块的主HLS函数声明
// -----------------------------------------------------------
void ddr_write_engine(
    hls::stream<ddr_write_packet_fixed>& input_ddr_write_stream,
    const ap_uint<11> max_x_res,
    const ap_uint<11> max_y_res,
    const ap_uint<32> num_write_ops_to_process, // PDTD输出的有效像素数
    zbuffer_ddr_word_t* output_zbuffer_ddr,  // 指向深度缓冲区的 64 位 AXI Master (其基地址由PS写入关联的m_axi控制寄存器)
    color_ddr_word_t* output_framebuffer_ddr // 指向帧缓冲区的 64 位 AXI Master (其基地址由PS写入关联的m_axi控制寄存器)
);

#endif // PDTD_HPP
